#pragma once

#include <dirent.h>
#include <fcntl.h>
#include <infiniband/verbs.h>
#include <netinet/in.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>


/**
 *! @brief 读取指定系统文件内容到buf地址
 * 
 * @param dir    文件路径
 * @param file   文件名
 * @param buf    文件内容存储地址
 * @param size   最大读取长度
 * @return int   真实文件内容长度
 */
int ibv_read_sysfs_file(const char *dir, const char *file, 
                        char *buf, size_t size);




/**
 *! @brief  查询网卡的GID类型
 * 
 * @param context   IBV设备上下文
 * @param port_num  网卡物理端口号
 * @param index 
 * @param type      返回GID的类型: IB, RoCE_V1, or RoCE_V2
 * @return int 
 */
int ibv_query_gid_type(struct ibv_context *context, uint8_t port_num, 
                    unsigned int index, enum ibv_gid_type *type);



/**
 * @brief 找到满足特定GID类型和GID族的GID索引
 * 
 * @param context    IBV设备上下文
 * @param port_num   网卡物理端口号
 * @param gid_type   GID的类型: IB, RoCE_V1, or RoCE_V2
 * @param gid_family 
 * @return int 
 */
int ibv_find_sgid_type(struct ibv_context *context, uint8_t port_num, 
                    enum ibv_gid_type gid_type, int gid_family);

